package my.menu.menuImp.AdminChildMenus;

import my.dao.daoImpl.BookDao;
import my.dao.daoImpl.UserDao;
import my.menu.Menu;
import my.vo.voImpl.User;


import java.util.List;
import java.util.Scanner;

/**
 * @author 星环
 * @date 2022/10/31 19:12:10
 * @description 重复的部分说明见 {@link AdminBookMenu}
 */
public class AdminUserMenu extends Menu {

    Scanner sc = new Scanner(System.in);
    private final UserDao userDao = UserDao.getInstance();
    private final BookDao bookDao = BookDao.getInstance();

    public AdminUserMenu(User user){
        super(List.of("添加用户","按id修改用户","按名字删除用户","显示全部用户","据姓名查找用户","根据id查找用户" ),
                List.of("addUser","updateUserById","deleteUserByName","showAll","srchUserByName","srchUserById" ));
        setUser(user);
    }

    /**
     * 添加用户，因为和注册完全没区别，就共用一个dao方法了
     * @return menu用，是否结束循环
     */
    protected boolean addUser(){
        //提示并获取需要的数据
        System.out.println("请输入添加用户的用户名和密码:");
        String name = sc.next();
        String password = sc.next();

        //注册
        User newUser = userDao.register(name, password);

        //回显结果
        if(newUser == null){
            System.out.println("添加失败，用户名重复");
            return true;
        }
        System.out.println("添加成功！");
        System.out.println(userDao.getByName(name));

        return true;
    }

    /**
     * 修改用户名和密码，uid不可变，用来查询
     * @return
     */
    protected boolean updateUserById(){

        System.out.println("请输入用户的id");
        int id = sc.nextInt();
        //看看有没有这个人
        if(!checkUserExistById(id)){
            return true;//没有，结束调用
        }

        System.out.println("请输入新的用户名和密码，如果不想修改，在对应位置输入-");
        String username = sc.next();
        String password = sc.next();

        //处理数据
        //组装用户
        User newInfo = new User();
        newInfo.setId(id);

        if(!"-".equals(username)){
            newInfo.setUsername(username);
        }
        if(!"-".equals(username)){
            newInfo.setPassword(password);
        }
        //开始更新，并回复
        User user1 = userDao.updateById(newInfo);
        if (user1 != null) {
            System.out.println("修改成功");
            System.out.println("用户的新信息为:");
            System.out.println(user1);
        }else {
            System.out.println("修改失败，用户重名，这可能被人用来猜管理员名字");
        }
        return true;
    }

    /**
     * 根据用户名删除用户
     * @return
     */
    protected boolean deleteUserByName(){
        //提示，获取信息
        System.out.println("请输入要删除的用户名字");
        String name = sc.next();

        //删除过程，删除用户并清掉他借的书
        deleteUserByNameImpl(name);

        return true;
    }

    /**
     * 显示所有用户
     * @return
     */
    protected boolean showAll(){
        userDao.getAll().forEach(System.out::println);
        return true;
    }

    /**
     * 根据用户名查找用户
     * @return
     */
    protected boolean srchUserByName(){
        System.out.println("请输入要找的人的名字");
        String name = sc.next();

        User user = userDao.getByName(name);

        if(user == null){
            System.out.println("查无此人！");
            return true;
        }
        System.out.println(user);
        return true;
    }

    /**
     * 根据id查找用户
     * @return
     */
    protected boolean srchUserById(){
        System.out.println("请输入要查找的用户的id");
        int uid = sc.nextInt();

        User user = userDao.getById(uid);

        if(user == null){
            System.out.println("查无此人！");
            return true;
        }
        System.out.println(user);
        return true;
    }

    /**
     * 根据uid查找有没有这个人
     * @param uid 要查找的uid
     * @return 有没有这个人
     */
    private boolean checkUserExistById(int uid){
        User user = userDao.getById(uid);
        if(user == null){
            System.out.println("查无此人！");
            return false;
        }
        System.out.println("找到用户");
        System.out.println(user);
        return true;
    }

    /**
     * 根据名字删除用户的实现
     * @param name
     * @return
     */
    private void deleteUserByNameImpl(String name) {
        //先清除他借的书
        bookDao.returnAllBookByUserId(user.getId());
        //再删除他
        User user = userDao.deleteByName(name);
        //把他借的书的借阅人id清掉
        if(user == null){
            System.out.println("查无此人");
            return;
        }
        System.out.println("被删除的用户如下：");
        System.out.println(user);
    }
}
